package proxy

// Subject 抽象的目标接口，定义具体的目标对象和代理共用的接口
type Subject interface {
	// Request 示意方法：一个抽象的请求方法
	Request() string
}

// RealSubject 具体的目标对象，是真正被代理的对象
type RealSubject struct{}

func (r *RealSubject) Request() string {
	// 执行具体的功能逻辑
	return "Do RealSubject Request"
}

// Proxy 代理对象
type Proxy struct {
	// 持有被代理的具体的目标对象
	realSubject *RealSubject
}

// NewProxy 构造方法，传入被代理的具体的目标对象
func NewProxy(subject *RealSubject) *Proxy {
	return &Proxy{
		realSubject: subject,
	}
}

func (p *Proxy) Request() string {
	var res string
	// 在转调具体的目标对象前，可以执行一些功能处理
	res += "Pre=>"
	// 转调具体的目标对象的方法
	res += p.realSubject.Request()

	// 在转调具体的目标对象后，可以执行一些功能
	res += "=>After"
	return res
}
